home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 3_0 / OIC_1 / OIC_SOUR / COLLECT.C < prev    next >
Text File  |  1989-03-05  |  3KB  |  134 lines

  1. /*    
  2.  *        Collection abstract class
  3.  *
  4.  *                            Andrew Nicholson - Not-So-Soft, Oz.
  5.  *
  6.  *    Provides the following methods to any subclass that responds to
  7.  *    head, tail, push, isEmpty
  8.  *
  9.  *        append c item    - appends item to collection c
  10.  *        copy c            - returns a new collection which is a copy of c
  11.  *        add c itemlist    - adds items to collection
  12.  *      sequence c        - returns an initialised sequence object containing c
  13.  *        repList c        - returns a representation list for c (ascii).
  14.  *        print c            - outputs nicely formatted collection c to stdout
  15.  *        deepDispose c    - dispose c and sends 'deepDispose' to all it contains
  16.  *        dispose c        - free the collection leaving what it contains
  17.  *        deepCopy c        - returns a deep copy of c
  18.  */
  19.  
  20. #include "oic.h"
  21. #include "generics.h"
  22.  
  23. class      Collect;
  24.  
  25. /* -------------------- Collection methods ---------------------------- */
  26.  
  27. method object
  28. _append(self, inst, item)            /* append item to the collection */
  29.     object        self;
  30.     void         *inst;
  31.     object        *item;
  32. {
  33.     register object c;
  34.      
  35.     for (c = self ; ! (int)isEmpty(c) ; c = tail(c));
  36.     push(c, *item);
  37.  
  38.     return self;
  39. }
  40.  
  41. method object
  42. _copy(self, inst, args)            /* Copy the collection */
  43.     object        self;
  44.     void         *inst, *args;
  45. {
  46.     if ((int)isEmpty(self))
  47.         return New(ClassOf(self));
  48.     else
  49.         return push(copy(tail(self)), head(self));
  50. }
  51.  
  52. method object
  53. _add(self, inst, items)            /* add items to collection                 */
  54.     object            self;
  55.     void             *inst;
  56.     register object    *items;
  57. {
  58.     while (*items != END)
  59.         append(self, *items++);
  60.     return self;
  61. }
  62.  
  63. method object
  64. _sequence(self)                    /* get a sequence over collection         */
  65.     object    self;
  66. {
  67.     return start(New(Linkseq), self);
  68. }
  69.  
  70. method object
  71. _repList(self)                    /* get a represention list */
  72.     object    self;
  73. {
  74.     register object  c;
  75.     register object    replist;
  76.  
  77.     replist = New(Replist, "(", ")", " ");
  78.  
  79.     if ((int)isEmpty(self))
  80.         append(replist, New(String, "EMPTY"));
  81.     else for (c = self; ! (int)isEmpty(c); c = tail(c))
  82.         append(replist, repList(head(c)));
  83.  
  84.     return replist;
  85. }
  86.  
  87. method void
  88. _deepDispose(self)
  89.     object    self;
  90. {
  91.     register object    c, nextc;
  92.     register object    item;
  93.  
  94.     for (c = self; !(int)isEmpty(c); c = nextc)
  95.     {
  96.         nextc = tail(c);
  97.         deepDispose(head(c));
  98.         free(c);
  99.     }
  100.     free(c);
  101. }
  102.     
  103. method void
  104. _dispose(self)
  105.     object    self;
  106. {
  107.     register object c, nextc;
  108.  
  109.     for (c = self; ! (int)isEmpty(c) ; c = nextc)
  110.     {
  111.         nextc = tail(c);
  112.         free(c);
  113.     }
  114.     free(c);
  115. }
  116.     
  117. /* ------------------- Init the Collection class ---------------------- */
  118.  
  119. InitCollect()
  120. {
  121.     Collect = NewClass(0, 0, "Collect", END);
  122.     AddMethods(Collect, 
  123.         appendGeneric,         _append,
  124.         copyGeneric,        _copy,
  125.         addGeneric,            _add,
  126.         sequenceGeneric,    _sequence,
  127.         repListGeneric,        _repList,
  128.         deepDisposeGeneric, _deepDispose,
  129.         disposeGeneric,        _dispose,
  130.         END
  131.        );
  132. }
  133.  
  134.